#include <mpi.h>
#include <stdio.h>
#include "utils.h"

int main(int argc, char** argv) {
    MPI_Datatype oldtype, newtype;
    //! 在64位系统上，MPI_Aint通常是64位的整数类型，用于表示地址和字节相关内容
    MPI_Aint lb, extent;  
    // 初始化 MPI 环境
    int rank, size;
    MPI_Init(&argc, &argv);
    // 获取当前进程的 rank 和总的进程数
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    // 创建一个现有的数据类型
    MPI_Type_contiguous(2, MPI_INT, &oldtype);
    // 注册数据类型oldtype
    MPI_Type_commit(&oldtype);

    // 获取现有数据类型的范围
    MPI_Type_get_extent(oldtype, &lb, &extent);  //! extent包含填充部分
    INFO("rank = %d, oldtype lb = %d, extent = %d\n", rank, lb, extent);  //! 0, 8

    //! 返回真实每个数据元素占据的字节综合，extent不包括填充的部分
    MPI_Type_get_true_extent(oldtype, &lb, &extent);
    INFO("rank = %d, oldtype lb = %d, extent = %d\n", rank, lb, extent);  //! 0, 8

    // 创建一个新的数据类型，调整其范围
    MPI_Aint new_lb = 0;
    MPI_Aint new_extent = 2 * extent;
    MPI_Type_create_resized(oldtype, new_lb, new_extent, &newtype);
    MPI_Type_commit(&newtype);

    // 使用新的数据类型进行通信
    // ...

    // 释放数据类型
    MPI_Type_free(&oldtype);
    MPI_Type_free(&newtype);

    // 结束 MPI 环境
    MPI_Finalize();

    return 0;
}